home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / programming / oberonv4 / source / system / amigatimer.mod (.txt) < prev    next >
Oberon Text  |  1996-06-02  |  3KB  |  118 lines

  1. Syntax20b.Scn.Fnt
  2. ParcElems
  3. Alloc
  4. Syntax24b.Scn.Fnt
  5. Syntax10.Scn.Fnt
  6. Syntax10i.Scn.Fnt
  7. Syntax10b.Scn.Fnt
  8. (* AMIGA *)
  9. MODULE AmigaTimer;    (* updated OJ 8 May 96 *)
  10. IMPORT SYSTEM, E:=AmigaExec;
  11. CONST
  12.   timerName * = "timer.device";
  13. (* unit defintions *)
  14.   microHz    * = 0;
  15.   vBlank     * = 1;
  16.   eClock     * = 2;
  17.   waitUntil  * = 3;
  18.   waitEClock * = 4;
  19.   TimeValPtr * = LONGINT;
  20.   TimeVal * = RECORD
  21.    secs* : LONGINT;
  22.    micro* : LONGINT
  23.   END;
  24.   EClockValPtr * = LONGINT;
  25.   EClockVal * = RECORD
  26.     hi* : LONGINT;
  27.     lo* : LONGINT
  28.   END;
  29.   TimeRequestPtr * = LONGINT;
  30.   TimeRequestPointer * = POINTER TO TimeRequest;
  31.   TimeRequest * = RECORD (E.IORequest)
  32.     time* : TimeVal
  33.   END;
  34. CONST
  35. (* IO_COMMAND to use for adding a timer *)
  36.   addRequest * = E.nonstd+0;
  37.   getSysTime * = E.nonstd+1;
  38.   setSysTime * = E.nonstd+2;
  39.     timerBase-: E.LibraryPtr;
  40.     waitReq : TimeRequestPtr;
  41.     timerMP : E.MsgPortPtr;
  42.     timerOpen : BOOLEAN;
  43.     termEntry : E.TermEntry;
  44. PROCEDURE -ReturnD0    04EH,05EH,  04EH,075H;
  45. PROCEDURE AddTime*(dest, src : TimeValPtr);
  46. BEGIN
  47.     SYSTEM.PUTREG( 8, dest );
  48.     SYSTEM.PUTREG( 9, src );
  49.     SYSTEM.CALL( -42, timerBase );
  50. END AddTime;
  51. PROCEDURE SubTime*(dest, src : TimeValPtr);
  52. BEGIN
  53.     SYSTEM.PUTREG( 8, dest );
  54.     SYSTEM.PUTREG( 9, src );
  55.     SYSTEM.CALL( -48, timerBase );
  56. END SubTime;
  57. PROCEDURE CmpTime*(dest, src : TimeValPtr) : LONGINT;
  58. BEGIN
  59.     SYSTEM.PUTREG( 8, dest );
  60.     SYSTEM.PUTREG( 9, src );
  61.     SYSTEM.CALL( -54, timerBase );
  62.     ReturnD0
  63. END CmpTime;
  64. PROCEDURE ReadEClock*(dest : EClockValPtr) : LONGINT;
  65. BEGIN
  66.     SYSTEM.PUTREG( 8, dest );
  67.     SYSTEM.CALL( -60, timerBase );
  68.     ReturnD0
  69. END ReadEClock;
  70. PROCEDURE GetSysTime*(dest : TimeValPtr);
  71. BEGIN
  72.     SYSTEM.PUTREG( 8, dest );
  73.     SYSTEM.CALL( -66, timerBase );
  74. END GetSysTime;
  75. PROCEDURE Wait*(sec, micro: LONGINT);
  76. VAR wreq : TimeRequestPointer;  r : SHORTINT;
  77. BEGIN
  78.     wreq := SYSTEM.VAL( TimeRequestPointer, waitReq );
  79.     wreq.time.secs := sec;
  80.     wreq.time.micro := micro;
  81.     r := E.DoIO(waitReq)
  82. END Wait;
  83. PROCEDURE Term;
  84. BEGIN
  85.     IF timerMP#0 THEN
  86.         IF waitReq#0 THEN
  87.             IF timerOpen THEN  E.CloseDevice(waitReq)  END;
  88.             E.DeleteIORequest( waitReq );
  89.         END;
  90.         E.DeleteMsgPort(timerMP)
  91.     END;
  92. END Term;
  93. PROCEDURE Init;
  94. TYPE TReqPtr = POINTER TO TimeRequest;
  95. VAR wreq : TimeRequestPointer;
  96. BEGIN
  97.     waitReq := 0;  timerOpen := FALSE;
  98.     timerMP:=E.CreateMsgPort();
  99.     IF timerMP#0 THEN
  100.         waitReq := E.CreateIORequest( timerMP, SIZE(TimeRequest) );
  101.         IF waitReq#0 THEN
  102.             timerOpen := ( E.OpenDevice(timerName, microHz, waitReq, {}) = 0 );
  103.             IF timerOpen THEN
  104.                 wreq := SYSTEM.VAL( TimeRequestPointer, waitReq );
  105.                 wreq.command := addRequest;
  106.                 wreq.time.secs := 0;  wreq.time.micro := 0;
  107.                 timerBase := wreq.device
  108.             ELSE
  109.                 HALT(99)
  110.             END;
  111.         END;
  112.     END;
  113. END Init;
  114. BEGIN
  115.     E.Register(termEntry, Term);
  116.     Init;
  117. END AmigaTimer.
  118.